package lintulaskenta.servlet.havainnointi;

import java.io.IOException;
import java.util.TreeMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import lintulaskenta.entity.Pistevuosi;
import lintulaskenta.pulautin.SyotteenTarkastaja;

// Mahdollistaa muokattavan pisteen valinnan.

public class PisteetServlet extends HttpServlet {

    private Pistevuosi p;
    private TreeMap<String, Object> yleinenTila;
    private SyotteenTarkastaja tarkastaja = new SyotteenTarkastaja();

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");

        HttpSession session = request.getSession(false);
        session.setAttribute("pisteenTila", new TreeMap<String, Object>());
        session.removeAttribute("havaintopisteet");
        yleinenTila = (TreeMap<String, Object>) session.getAttribute("yleinenTila");

        // Valitaan piste muokattavaksi parametrin perusteella.
        if (request.getParameter("select") != null && tarkastaja.isANumber(request.getParameter("select"))) {
            yleinenTila.put("tila", false);
            int piste = Integer.parseInt(request.getParameter("select"));
            TreeMap<Integer, Pistevuosi> reittipisteet = (TreeMap<Integer, Pistevuosi>) session.getAttribute("pisteet");
            if (piste > 0 && piste <= reittipisteet.size()) {
                p = reittipisteet.get((Integer) piste);
                session.setAttribute("piste", p);
            }
        }

        // Valitaan seuraava piste muokattavaksi.
        if (request.getParameter("next") != null) {
            Pistevuosi pv = (Pistevuosi) session.getAttribute("piste");
            TreeMap<Integer, Pistevuosi> reittipisteet = (TreeMap<Integer, Pistevuosi>) session.getAttribute("pisteet");
            if (pv.getPisteenJarjestysnumero() == reittipisteet.size()) {
                p = reittipisteet.get(1);
            } else {
                p = reittipisteet.get((Integer) pv.getPisteenJarjestysnumero() + 1);
            }
            session.setAttribute("piste", p);
        }

        // Valitaan edellinen piste muokattavaksi.
        if (request.getParameter("previous") != null) {
            Pistevuosi pv = (Pistevuosi) session.getAttribute("piste");
            TreeMap<Integer, Pistevuosi> reittipisteet = (TreeMap<Integer, Pistevuosi>) session.getAttribute("pisteet");
            if (pv.getPisteenJarjestysnumero() - 1 < 1) {
                p = reittipisteet.get(reittipisteet.size());
            } else {
                p = reittipisteet.get((Integer) pv.getPisteenJarjestysnumero() - 1);
            }
            session.setAttribute("piste", p);
        }

        // Siirrytään pisteen muokkaustilaan.
        if (request.getParameter("update") != null) {
            yleinenTila.put("tila", false);
            TreeMap<Integer, Pistevuosi> pisteet = (TreeMap<Integer, Pistevuosi>) session.getAttribute("pisteet");
            session.setAttribute("piste", pisteet.firstEntry().getValue());
        }

        // Poistutaan pisteen muokkaustilasta.
        if (request.getParameter("save") != null) {
            yleinenTila.put("tila", true);
            session.removeAttribute("piste");
        }
        
        response.sendRedirect(yleinenTila.get("url") + "#pisteet");
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);

    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}